home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
xpaint-2.1.1
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-03
|
8KB
|
324 lines
/* +-------------------------------------------------------------------+ */
/* | Copyright 1992, 1993, David Koblas (koblas@netcom.com) | */
/* | | */
/* | Permission to use, copy, modify, and to distribute this software | */
/* | and its documentation for any purpose is hereby granted without | */
/* | fee, provided that the above copyright notice appear in all | */
/* | copies and that both that copyright notice and this permission | */
/* | notice appear in supporting documentation. There is no | */
/* | representations about the suitability of this software for | */
/* | any purpose. this software is provided "as is" without express | */
/* | or implied warranty. | */
/* | | */
/* +-------------------------------------------------------------------+ */
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <X11/StringDefs.h>
#include <stdio.h>
#include <fcntl.h>
#ifndef NOSTDHDRS
#include <unistd.h>
#endif
#define DEFINE_GLOBAL
#include "xpaint.h"
#include "misc.h"
#include "XPaintIcon.xpm"
static char *appDefaults[] = {
#include "XPaint.ad.h"
NULL
};
typedef struct {
String visualType;
String size;
String help;
String rcFile;
Boolean popped;
} AppInfo;
static AppInfo appInfo;
static XtResource resources[] = {
{ "visualType", "VisualType", XtRString, sizeof(String),
XtOffset(AppInfo*, visualType), XtRImmediate, (XtPointer)"default" },
{ "size", "Size", XtRString, sizeof(String),
XtOffset(AppInfo*, size), XtRImmediate, (XtPointer)"640x480" },
{ "rcFile", "RcFile", XtRString, sizeof(String),
XtOffset(AppInfo*, rcFile), XtRImmediate, (XtPointer)NULL },
{ "help", "Help", XtRString, sizeof(String),
XtOffset(AppInfo*, help), XtRImmediate, (XtPointer)NULL },
{ "popped", "Popped", XtRBoolean, sizeof(Boolean),
XtOffset(AppInfo*, popped), XtRImmediate, (XtPointer)False },
};
static XrmOptionDescRec options[] = {
{ "-24", ".visualType", XrmoptionNoArg, (XtPointer)"true24" },
{ "-12", ".visualType", XrmoptionNoArg, (XtPointer)"cmap12" },
{ "-size", ".size", XrmoptionSepArg, (XtPointer)NULL },
{ "-rcFile", ".rcFile", XrmoptionSepArg, (XtPointer)NULL },
{ "-popped", ".popped", XrmoptionNoArg, (XtPointer)"True" },
{ "-help", ".help", XrmoptionNoArg, (XtPointer)"command" },
{ "+help", ".help", XrmoptionSepArg, (XtPointer)NULL },
};
void BrushInit(Widget);
void HelpInit(Widget);
void OperationInit(Widget);
void InitTypeConverters();
/*
** Public query functions for application defaults
*/
void GetDefaultWH(int *w, int *h)
{
int x, y;
unsigned int width, height;
XParseGeometry(appInfo.size, &x, &y, &width, &height);
*w = width;
*h = height;
}
char *GetDefaultRC()
{
return appInfo.rcFile;
}
/*
** Create a nice icon image for XPaint...
*/
void SetIconImage(Widget w, Boolean flag)
{
static Pixmap icon = None;
static int iconW = 1, iconH = 1;
Window iconWindow;
XWMHints wmHints;
Screen *screen = XtScreen(w);
Display *dpy = XtDisplay(w);
#if 0
int i, count;
XIconSize *list;
/*
** Should use this information
*/
XGetIconSizes(dpy, RootWindowOfScreen(screen), &list, &count);
printf("got %d sizes\n", count);
for (i = 0; i < count; i++) {
printf("#%d: min = %d,%d max = %d,%d inc = %d,%d\n", i,
list[i].min_width, list[i].min_height,
list[i].max_width, list[i].max_height,
list[i].width_inc, list[i].height_inc);
}
XFree((XPointer)list);
#endif
/*
** Build the XPaint icon
*/
iconWindow = XCreateSimpleWindow(dpy, RootWindowOfScreen(screen),
0, 0, /* x, y */
iconW, iconH, 0,
BlackPixelOfScreen(screen),
BlackPixelOfScreen(screen));
if (icon == None) {
XpmCreatePixmapFromData(dpy, iconWindow,
XPaintIcon_xpm, &icon, NULL, NULL);
GetPixmapWHD(dpy, icon, &iconW, &iconH, NULL);
XResizeWindow(dpy, iconWindow, iconW, iconH);
}
XSetWindowBackgroundPixmap(dpy, iconWindow, icon);
XtVaSetValues(w, XtNiconWindow, iconWindow, NULL);
}
/*
** The rest of main
*/
extern void HelpTextOutput(FILE*, char *);
static void usage(char *prog, char *msg)
{
if (msg)
fprintf(stderr,"%s\n", msg);
fprintf(stderr,"Usage: %s\n", prog);
HelpTextOutput(stderr, appInfo.help == NULL ? "command" : appInfo.help);
exit(1);
}
typedef struct {
XtWorkProcId id;
Widget toplevel;
int nfiles;
int pos;
char **files;
} LocalInfo;
extern void StateSetBusy(Boolean);
extern char *RWGetMsg();
static void workProc(LocalInfo *l)
{
extern void GraphicOpenFile(Widget, char *, void *);
extern void *ReadMagic(char *);
char *file;
void *v;
if (l == NULL || l->id == None)
return;
XtRemoveWorkProc(l->id);
l->id = None;
file = l->files[l->pos];
StateSetBusy(True);
if ((v = (void *)ReadMagic(file)) != NULL) {
GraphicOpenFile(l->toplevel, file, v);
} else {
Notice(l->toplevel, "Unable to open input file \"%s\"\n %s", file, RWGetMsg());
}
StateSetBusy(False);
if (++l->pos == l->nfiles) {
XtFree((XtPointer)l->files);
XtFree((XtPointer)l);
} else {
l->id = XtAppAddWorkProc(XtWidgetToApplicationContext(l->toplevel), (XtWorkProc)workProc, (XtPointer)l);
}
}
void main(Cardinal argc, char *argv[])
{
Pixmap icon;
XtAppContext app;
Display *dpy;
Widget toplevel;
int i;
XEvent event;
Arg args[5];
int nargs = 0;
XrmDatabase rdb;
char *rmType;
XrmValue rvalue;
Boolean isIcon;
InitTypeConverters();
/*
** Create the application context
*/
toplevel = XtAppInitialize(&Global.appContext, "XPaint",
options, XtNumber(options), &argc, argv,
appDefaults, args, nargs);
XtGetApplicationResources(toplevel, (XtPointer)&appInfo,
resources, XtNumber(resources), NULL, 0);
rdb = XtDatabase(XtDisplay(toplevel));
if (appInfo.help != NULL)
usage(argv[0],NULL);
if (strcmp(appInfo.visualType, "default") != 0) {
char *cp = appInfo.visualType;
if (strncmp(cp, "cmap", 4) == 0) {
XrmPutStringResource(&rdb, "Canvas*visual", "PseudoColor");
cp+=4;
} else if (strncmp(cp, "true", 4) == 0) {
XrmPutStringResource(&rdb, "Canvas*visual", "TrueColor");
cp+=4;
} else if (strncmp(cp, "gray", 4) == 0) {
XrmPutStringResource(&rdb, "Canvas*visual", "StaticGray");
cp+=4;
} else {
usage(argv[0], "bad visual type specification");
}
if (*cp != '\0')
XrmPutStringResource(&rdb, "Canvas*depth", cp);
}
if (argc != 1 && argv[1][0] == '-')
usage(argv[0], "Invalid option");
/*
** A little initilization
*/
Global.region.image = NULL;
Global.region.cmap = None;
Global.region.width = 0;
Global.region.height= 0;
Global.region.pix = None;
Global.region.mask = None;
/*
**
*/
XtVaGetValues(toplevel, XtNiconic, &isIcon, NULL);
if (isIcon)
XrmPutStringResource(&rdb, "Canvas.iconic", "on");
/*
** Now build and construct the widgets
*/
Global.timeToDie = False;
app = XtWidgetToApplicationContext(toplevel);
dpy = Global.display = XtDisplay(toplevel);
/*
** Call the initializers
*/
OperationInit(toplevel);
/*
** A few rogue initaliziers
*/
BrushInit(toplevel);
HelpInit(toplevel);
SetIconImage(toplevel, True);
/*
** Realize it (doesn't hurt)
*/
XtRealizeWidget(toplevel);
/*
** Now open any file on the command line
*/
if (argc != 1) {
LocalInfo *l = XtNew(LocalInfo);
l->pos = 0;
l->toplevel = toplevel;
l->nfiles = argc - 1;
l->files = (char **)XtCalloc(argc, sizeof(char*));
for (i = 1; i < argc; i++)
l->files[i-1] = argv[i];
l->id = XtAppAddWorkProc(app, (XtWorkProc)workProc, (XtPointer)l);
} else if (appInfo.popped) {
/*
** If nothing is comming up, bring up a blank canvas
*/
GraphicCreate(toplevel, 0);
}
/*
** MainLoop
*/
do {
XtAppNextEvent(app, &event);
if (event.type == ButtonPress || event.type == ButtonRelease)
Global.currentTime = event.xbutton.time;
XtDispatchEvent(&event);
} while (!Global.timeToDie);
}